Przemyslaw Biecek
Zanim zaczniemy tworzyć pierwszy wykres, musimy przygotować dane do rysowania. Dane można przygotować na wiele sposobów, najprostszym z nich jest użycie pakietu dplyr.
library(dplyr)
con <- url("http://biecek.pl/MIMUW/cenyAutI2012.Rdata")
print(load(con))
## [1] "cenyAutI2012"
wybraneAuta <- cenyAutI2012 %>%
filter(Marka %in% c("Volkswagen", "Opel", "Audi", "Mercedes-Benz", "BMW"))
avgs <- wybraneAuta %>%
group_by(Marka, Rok.produkcji) %>%
summarise(cena = median(Cena.w.PLN, na.rm=TRUE),
przebieg = median(Przebieg.w.km, na.rm=TRUE),
liczba = n()) %>%
filter(liczba >= 10)
avgs
## Source: local data frame [143 x 5]
## Groups: Marka
##
## Marka Rok.produkcji cena przebieg liczba
## 1 Audi 1987 2400 253000 16
## 2 Audi 1988 2200 239000 17
## 3 Audi 1989 2500 240000 21
## 4 Audi 1990 2600 254500 38
## 5 Audi 1991 4000 214575 57
## 6 Audi 1992 4650 227000 114
## 7 Audi 1993 5500 230000 131
## 8 Audi 1994 6250 233566 152
## 9 Audi 1995 7900 215000 286
## 10 Audi 1996 8900 209000 395
## .. ... ... ... ... ...
W pakiecie ggplot2 wykresy można tworzyć na dwa sposoby:
Nam zależy nam na profesjonalnej grafice, więc będziemy pracować z funkcją ggplot().
Zaczniemy od wykresy punktowego.
library(ggplot2)
ggplot(avgs, aes(x=przebieg, y=cena)) +
geom_point()
Funkcja ggplot wymaga określenia dwóch argumentów: zbioru danych oraz zbioru mapowań (aesthetic mappings, funkcja aes()). Wybrawszy dane i mapowania można przejść do opisu geometrii.
Grafika produkowana przez pakiet ggplot jest nazywana ‘high quality elegant graphics’ (przynajmniej przez entuzjastów tego pakietu). Zobaczmy dlaczego. Porównajmy dwa wykres z dwóch bibliotek programu R, oba wykresy z domyślnymi ustawieniami. Oba wykresy rysujemy na obszarze 4x4 cale.
plot(avgs$przebieg, avgs$cena) # base graphics
ggplot(avgs, aes(x=przebieg, y=cena)) + # ggplot graphics
geom_point()
Znajd przynajmniej trzy różnice pomiędzy tymi wykresami
Myśląc o wykresie, w pierwszym kroku myślimy o jego geometrii.
Pakiet ggplot pozwala na wybór spośród wielu geometrii. Ich lista jest dostępna na stronie http://docs.ggplot2.org/current/. Na tych zajęciach będziemy pracować z kilkoma najpopularniejszymi, ale z pozostałych korzysta się w bardzo podobny sposób.
Przyjrzyjmy się na początek trzem geometriom: geom_point(), geom_text(), geom_smooth().
W dokumentacji dla każdej geometrii można zobaczyć jakie właściwości tej geometrii można określić.
Dla geom_text trzy obowiązkowe to x, y i label. http://docs.ggplot2.org/current/geom_text.html.
tylkoAudi <- avgs %>%
filter(Marka == "Audi")
ggplot(tylkoAudi, aes(x=przebieg, y=cena)) +
geom_point()
ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
geom_text()
A co z nieobowiązkowymi mapowaniami? Też mogą być przydatne.
ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
geom_text(aes(size=liczba))
ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
geom_text(aes(size=liczba), hjust=1, vjust=0) +
geom_point()
W kolejnych krokach, można dopracowywać szczegóły, np. etykiety na osiach.
library(scales)
ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
geom_text(aes(size=liczba)) +
scale_x_continuous(labels = comma) +
scale_y_continuous(labels = comma)
Uwaga, mapuje się tylko zmienne. Pojedyncze wartości / stałe określa się inaczej.
ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
geom_text(aes(size=5))
ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
geom_text(size=5)
Pracując ze zmiennymi ciągłymi, szukając zależności typu regresyjnego, jedną z ciekawszych geometrii jest geom_smooth().
ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
geom_smooth()
ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
geom_smooth() + xlim(1980,2012)
Usuniemy teraz przedział ufności dla średniej i dodajmy punkty do wykresu (kolejną geometrię).
ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
geom_point(alpha=0.5) +
geom_smooth(se = FALSE, size=5, colour="red") +
xlim(1980,2012) + ylim(0,200000)
Zauważmy, że geom_smooth() nie tylko wygładza. Można dodatkowymi parametrami określić jaki model regresyjny ma być przedstawiony na wykresie.
ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
geom_point(alpha=0.4) +
geom_smooth(se = FALSE, size=2) +
geom_smooth(se = FALSE, size=2, method = "lm", colour="red") +
geom_smooth(se = FALSE, size=2, method = "lm", colour="green", formula = y ~ poly(x,2)) +
xlim(1980,2012) + ylim(0,200000)
Zmieniamy stopień wygładzenia.
ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
geom_point(alpha=0.4) +
geom_smooth(se = FALSE, size=2, colour="blue", span=0.9, method="loess") +
geom_smooth(se = FALSE, size=2, colour="red", span=0.1, method="loess") +
xlim(1980,2012) + ylim(0,200000)
Składając różne mapowania i geometrie można uzyskać bardzo ciekawe rozwiązania
ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN, colour=Marka)) +
geom_point(alpha=0.4) +
geom_smooth(se = FALSE, size=2) +
xlim(1980,2012) + ylim(0,200000)
Wykresy paskowe i ich odmiany są wygodne w przedstawianiu zmiennych jakościowych. Jako przykład wykorzystamy geom_bar().
ggplot(wybraneAuta, aes(x=Rok.produkcji)) +
geom_bar()
# horizontal or vertical?
ggplot(wybraneAuta, aes(x=Rok.produkcji)) +
geom_bar() +
coord_flip()
ggplot(wybraneAuta, aes(x=Marka)) +
geom_bar()
# horizontal or vertical?
ggplot(wybraneAuta, aes(x=Marka)) +
geom_bar() +
coord_flip()
Zobacz jakie parametry geometrii geom_bar() można modyfikować http://docs.ggplot2.org/current/geom_bar.html.
Jednym z takich parametrów jest ‘position’.
ggplot(wybraneAuta, aes(x=Marka, fill=Rodzaj.paliwa)) +
geom_bar() + coord_flip()
# Position = dodge
ggplot(wybraneAuta, aes(x=Marka, fill=Rodzaj.paliwa)) +
geom_bar(position="dodge") + coord_flip()
# Position = fill
ggplot(wybraneAuta, aes(x=Marka, fill=Rodzaj.paliwa)) +
geom_bar(position="fill") + coord_flip()
# Procenty na osi OX
ggplot(wybraneAuta, aes(x=Marka, fill=Rodzaj.paliwa)) +
geom_bar(position="fill") + coord_flip() +
scale_y_continuous(label=percent)
Liczba geometrii dostępnych w pakiecie ggplot2 się zmienia. Czasem przybywają nowe, nadmiarowe geometrie mogą zostać zredukowane. W dodatkowych pakietach można również znaleźć nowe geometrie.
Aby sprawdzić jaka jest aktualna lista geometrii najlepiej odwiedzić stronę http://docs.ggplot2.org/current/.
ggplot(wybraneAuta, aes(y=Przebieg.w.km, x=Rodzaj.paliwa)) +
geom_boxplot() + ylim(0,300000)
ggplot(wybraneAuta, aes(x=Przebieg.w.km, fill=Rodzaj.paliwa)) +
geom_density() + xlim(0,300000)
ggplot(wybraneAuta, aes(x=Przebieg.w.km, fill=Rodzaj.paliwa)) +
geom_density(alpha=0.5) + xlim(0,300000)
ggplot(wybraneAuta, aes(x=Przebieg.w.km, fill=Rodzaj.paliwa)) +
geom_histogram() + xlim(0,300000)